home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / fpc / oop / ExecObject.pas.bak < prev    next >
Text File  |  2000-01-01  |  13KB  |  540 lines

  1. unit ExecObject;
  2.  
  3.  
  4. interface
  5.  
  6. uses Exec,amigalib,strings;
  7.  
  8.  
  9.  
  10. type
  11.     pExecObject = ^tExecObject;
  12.     tExecObject = object
  13.         public
  14.         constructor Create;
  15.         destructor Free;
  16.         {
  17.           We can't have overlay functions in the
  18.           current amiga version. Have to change
  19.           this later. (Add and AddS)
  20.         }
  21.         function AddS( s : string): pNode;
  22.         function Add(s : PChar): pNode;
  23.         procedure PrintList;
  24.         function Count: integer;
  25.         function TheList: pList;
  26.         procedure Clear;
  27.         procedure Delete( node : pNode);
  28.         { Have to change FindS and Find }
  29.         function FindS(data : string): pNode;
  30.         function Find(data : PChar): pNode;
  31.         function First: pNode;
  32.         function Last: pNode;
  33.         function Next(node : pNode): pNode;
  34.         function GetData(node : pNode): pChar;
  35.         function IndexOf( num : integer): pNode;
  36.         function Prev( node : pNode): pNode;
  37.         function InsertS( data : string; node : pNode): pNode;
  38.         function Insert( data : PChar; node : pNode): pNode;
  39.         procedure ToBuffer(var buf: PChar);
  40.         procedure Bottom(node : pNode);
  41.         procedure Down(node : pNode);
  42.         procedure Top(node : pNode);
  43.         procedure Up(node : pNode);
  44.         procedure DeleteLast;
  45.         
  46.         procedure DeleteDup;
  47.         function SizeOfList: longint;
  48.         procedure Sort;
  49.         function UpDateS(node : pNode; data : string): boolean;
  50.         function UpDate(node : pNode; data : PChar): boolean;
  51.         function FileToList(thefile : PChar): boolean;
  52.         function FileToListS(thefile : String): boolean;
  53.         function ListToFile(TheFile : PChar): Boolean;
  54.         function ListToFileS(TheFile : String): Boolean;
  55.          {
  56.         function Copy: pList;
  57.         }
  58.         private
  59.         elist : pList;
  60.         number  : integer;
  61.         totalsize : longint;
  62.         procedure Error(err : integer);
  63.         end;
  64.  
  65. implementation
  66.  
  67. constructor tExecObject.Create;
  68. begin
  69.     elist := nil;
  70.     New(elist);
  71.     NewList(elist);
  72.     number := 0;
  73. end;
  74.  
  75. destructor tExecObject.Free;
  76. var
  77.     temp : pNode;
  78. begin
  79.     while elist^.lh_Head <> @elist^.lh_Tail do begin
  80.        temp := pNode(elist^.lh_Head);
  81.        if assigned(temp) then begin
  82.            if assigned(temp^.ln_Name) then begin
  83.               { writeln('freeing ',temp^.ln_Name);}
  84.                StrDispose(temp^.ln_Name);
  85.            end;
  86.            RemHead(elist);
  87.            Dispose(temp);
  88.        end;
  89.     end;
  90.     if assigned(elist) then begin
  91.      {  writeln('freeing the list');}
  92.        Dispose(elist);
  93.        elist := nil;
  94.     end; 
  95. end;
  96.  
  97. function tExecObject.AddS( s : string): pNode;
  98. var
  99.     temp : pNode;
  100. begin
  101.     New(temp);
  102.     temp^.ln_Name := StrAlloc(Length(s)+1);
  103.     if Assigned(temp^.ln_Name) then begin
  104.         StrPCopy(temp^.ln_Name,s);
  105.         temp^.ln_Type := 0;
  106.         temp^.ln_Pri := 0;
  107.         AddTail(elist,temp);
  108.         inc(number);
  109.         AddS := temp;
  110.     end else AddS := nil;
  111. end;
  112.  
  113. function tExecObject.Add( s : PChar): pNode;
  114. var
  115.     temp : pNode;
  116. begin
  117.     New(temp);
  118.     temp^.ln_Name := StrAlloc(StrLen(s)+1);
  119.     if Assigned(temp^.ln_Name) then begin
  120.         StrCopy(temp^.ln_Name,s);
  121.         temp^.ln_Type := 0;
  122.         temp^.ln_Pri := 0;
  123.         AddTail(elist,temp);
  124.         inc(number);
  125.         Add := temp;
  126.     end else Add := nil;
  127. end;
  128.  
  129. procedure tExecObject.PrintList;
  130. var
  131.    temp : pNode;
  132.    i : integer;
  133. begin
  134.    temp := elist^.lh_Head;
  135.    for i := 1 to Count do begin
  136.       if assigned(temp^.ln_Name) then writeln('Node ',i,': ',temp^.ln_Name);
  137.       temp := temp^.ln_Succ;
  138.    end;
  139. end;
  140.  
  141. function tExecObject.Count: Integer;
  142. begin
  143.    Count := number;
  144. end;
  145.  
  146. function tExecObject.TheList: pList;
  147. begin
  148.    TheList := elist;
  149. end;
  150.  
  151. procedure tExecObject.Error(err : integer);
  152. begin
  153.    Halt(err);
  154. end;
  155.  
  156. procedure tExecObject.Clear;
  157. var
  158.     temp : pNode;
  159. begin
  160.     while elist^.lh_Head <> @elist^.lh_Tail do begin
  161.         temp := elist^.lh_Head;
  162.         if assigned(temp) then begin
  163.             if assigned(temp^.ln_Name) then StrDispose(temp^.ln_Name);
  164.             RemHead(elist);
  165.             Dispose(temp);
  166.         end;
  167.     end;
  168. end;
  169.  
  170. procedure tExecObject.Delete( node : pNode);
  171. begin
  172.    if assigned(node) then begin
  173.       if assigned(node^.ln_Name) then StrDispose(node^.ln_Name);
  174.       Remove(node);
  175.       Dispose(node);
  176.       dec(number);
  177.    end;
  178. end;
  179.  
  180. function tExecObject.FindS(data : string): pNode;
  181. var
  182.    temp : pNode;
  183.    result : pNode;
  184.    p : PChar;
  185. begin
  186.    result := nil;
  187.    p := StrAlloc(length(data)+1);
  188.    StrPCopy(p,data);
  189.    if elist^.lh_Head^.ln_Succ <> nil then begin
  190.       temp := elist^.lh_Head;
  191.       while (temp^.ln_Succ <> nil) do begin
  192.           if (StrIComp(temp^.ln_Name,p)=0) then begin
  193.               result := temp;
  194.               break;
  195.           end;
  196.           temp := temp^.ln_Succ;
  197.       end;
  198.    end;
  199.    StrDispose(p);
  200.    FindS := result;
  201. end;
  202.  
  203. function tExecObject.Find(data : PChar): pNode;
  204. var
  205.    temp : pNode;
  206.    result : pNode;
  207. begin
  208.    result := nil;
  209.    if elist^.lh_Head^.ln_Succ <> nil then begin
  210.       temp := elist^.lh_Head;
  211.       while (temp^.ln_Succ <> nil) do begin
  212.           if (StrIComp(temp^.ln_Name,data)=0) then begin
  213.               result := temp;
  214.               break;
  215.           end;
  216.           temp := temp^.ln_Succ;
  217.       end;
  218.    end;
  219.    Find := result;
  220. end;
  221.  
  222. function tExecObject.First: pNode;
  223. var
  224.    head : pNode;
  225. begin
  226.    head := elist^.lh_Head;
  227.    if assigned(head^.ln_Succ) then First := head
  228.    else First := nil;
  229. end;
  230.  
  231. function tExecObject.Last: pNode;
  232. var
  233.    tail : pNode;
  234. begin
  235.    tail := elist^.lh_TailPred;
  236.    if assigned(tail^.ln_pred) then Last := tail
  237.    else Last := nil;
  238. end;
  239.  
  240. function tExecObject.Next(node : pNode): pNode;
  241. var
  242.    nxt : pNode;
  243. begin
  244.    nxt := node^.ln_Succ;
  245.    if assigned(nxt^.ln_Succ) then Next := nxt
  246.    else Next := nil;
  247. end;
  248.  
  249. function tExecObject.GetData(node : pNode): pChar;
  250. begin
  251.    if assigned(node) then begin
  252.       if assigned(node^.ln_Name) then GetData := node^.ln_Name
  253.       else GetData := nil;
  254.    end;
  255. end;
  256.  
  257. function tExecObject.IndexOf( num : integer): pNode;
  258. var
  259.    node : pNode;
  260.    i : integer;
  261. begin
  262.    if num <=Count then begin
  263.       node := elist^.lh_Head;
  264.       for i := 1 to num do begin
  265.          node := node^.ln_Succ;
  266.       end;
  267.       IndexOf := node;
  268.    end else IndexOf := nil;
  269. end;
  270.  
  271. function tExecObject.Prev( node : pNode): pNode;
  272. var
  273.    pred : pNode;
  274. begin
  275.    pred := node^.ln_Pred;
  276.    if assigned(pred^.ln_Pred) then Prev := pred
  277.    else Pred := nil;
  278. end;
  279.  
  280. function tExecObject.InsertS( data : string; node : pNode): pNode;
  281. var
  282.    temp : pNode;
  283. begin
  284.    temp := AddS(data);
  285.    if assigned(temp) then begin
  286.       if assigned(node) then begin
  287.           Remove(temp);
  288.           ExecInsert(elist,temp,node);
  289.       end;
  290.       InsertS := temp;
  291.    end else InsertS := nil;
  292. end;
  293.  
  294. function tExecObject.Insert( data : PChar; node : pNode): pNode;
  295. var
  296.    temp : pNode;
  297. begin
  298.    temp := Add(data);
  299.    if assigned(temp) then begin
  300.       if assigned(node) then begin
  301.           Remove(temp);
  302.           ExecInsert(elist,temp,node);
  303.       end;
  304.       Insert := temp;
  305.    end else Insert := nil;
  306. end;
  307.  
  308. procedure tExecObject.ToBuffer(var buf: PChar);
  309. var
  310.    i : integer;
  311.    temp : pNode;
  312. begin
  313.    buf[0] := #0;
  314.    temp := elist^.lh_Head;
  315.    for i := 1 to number do begin
  316.       if assigned(temp^.ln_Name) then begin
  317.          strcat(buf,temp^.ln_Name);
  318.          if i < number then strCat(buf,PChar(';'#0));
  319.       end;
  320.       temp := temp^.ln_Succ;
  321.    end;
  322. end;
  323.  
  324. procedure tExecObject.Bottom(node : pNode);
  325. begin
  326.    if assigned(node) then begin
  327.       Remove(node);
  328.       AddTail(elist,node);
  329.    end;
  330. end;
  331.  
  332. procedure tExecObject.Down(node : pNode);
  333. var
  334.    succ : pNode;
  335. begin
  336.    succ := node^.ln_Succ;
  337.    if assigned(node) and assigned(succ) then begin
  338.       Remove(node);
  339.       ExecInsert(elist,node,succ);
  340.    end;
  341. end;
  342.  
  343. procedure tExecObject.Top(node : pNode);
  344. begin
  345.    if assigned(node) then begin
  346.       Remove(node);
  347.       AddHead(elist,node);
  348.    end;
  349. end;
  350.  
  351. procedure tExecObject.Up(node : pNode);
  352. var
  353.    pred : pNode;
  354. begin
  355.    pred := node^.ln_Pred;
  356.    if assigned(node) and assigned(pred) then begin
  357.       pred := pred^.ln_Pred;
  358.       Remove(node);
  359.       ExecInsert(elist,node,pred);
  360.    end;
  361. end;
  362. procedure tExecObject.DeleteLast;
  363. var
  364.    temp : pNode;
  365. begin
  366.    temp := elist^.lh_TailPred;
  367.    if assigned(temp) then begin
  368.       if assigned(temp^.ln_Name) then StrDispose(temp^.ln_Name);
  369.       RemTail(elist);
  370.       Dispose(temp);
  371.       dec(number);
  372.    end;
  373. end;
  374.  
  375. procedure tExecObject.DeleteDup;
  376. var
  377.    temp : pNode;
  378.    nxt  : pNode;
  379. begin
  380.    temp := elist^.lh_Head;
  381.    while assigned(temp^.ln_Succ) do begin
  382.       nxt := temp^.ln_Succ;
  383.       if (StrIComp(temp^.ln_Name,nxt^.ln_Name)=0) then begin
  384.          Delete(temp);
  385.       end;
  386.       temp := nxt;
  387.    end;
  388. end;
  389.  
  390. function tExecObject.SizeOfList: longint;
  391. var
  392.    temp : pNode;
  393.    tsize : longint;
  394.    i : integer;
  395. begin
  396.    tsize := 0;
  397.    temp := elist^.lh_Head;
  398.    for i := 1 to number do begin
  399.       if assigned(temp^.ln_Name) then tsize := tsize + (StrLen(temp^.ln_Name));
  400.       temp := temp^.ln_Succ;
  401.    end;
  402.    SizeOfList := tsize;
  403. end;
  404.  
  405. procedure tExecObject.Sort;
  406. VAR
  407.     notfinished : BOOLEAN;
  408.     tfirst, second : pNode;
  409.     n   : Longint;
  410.  
  411. BEGIN
  412.     IF assigned(elist^.lh_Head^.ln_Succ) then begin
  413.         notfinished := True;
  414.         WHILE (notfinished) DO BEGIN
  415.             notfinished := FALSE;
  416.             tfirst := elist^.lh_Head;
  417.             IF assigned(tfirst) THEN BEGIN
  418.                 n := 1;
  419.                 second := tfirst^.ln_Succ;
  420.                 WHILE n <> number DO BEGIN
  421.                     n := n + 1;
  422.                     IF (StrIComp(tfirst^.ln_Name,second^.ln_Name)>0) THEN BEGIN
  423.                         Remove(tfirst);
  424.                         ExecInsert(elist,tfirst,second);
  425.                         notfinished := True;
  426.                     END ELSE
  427.                         tfirst := second;
  428.                     second := tfirst^.ln_Succ;
  429.                 END;
  430.             END;
  431.         END;
  432.     END;
  433. END;
  434.  
  435.  
  436. function tExecObject.UpDateS(node : pNode; data : string): boolean;
  437. var
  438.    result : boolean;
  439. begin
  440.    if assigned(node^.ln_Succ) then begin
  441.       if assigned(node^.ln_Name) then begin
  442.          StrDispose(node^.ln_Name);
  443.          node^.ln_Name := StrAlloc(length(data)+1);
  444.          if assigned(node^.ln_Name) then begin
  445.             StrPCopy(node^.ln_Name,data);
  446.             result := true;
  447.          end else result := false;
  448.       end;
  449.       UpDateS := result;
  450.    end;
  451. end;
  452.  
  453. function tExecObject.UpDate(node : pNode; data : PChar): boolean;
  454. var
  455.    result : boolean;
  456. begin
  457.    if assigned(node^.ln_Succ) then begin
  458.       if assigned(node^.ln_Name) then begin
  459.          StrDispose(node^.ln_Name);
  460.          node^.ln_Name := StrAlloc(strlen(data)+1);
  461.          if assigned(node^.ln_Name) then begin
  462.             StrCopy(node^.ln_Name,data);
  463.             result := true;
  464.          end else result := false;
  465.       end;
  466.       UpDate := result;
  467.    end;
  468. end;
  469.  
  470. function tExecObject.FileToList(thefile : PChar): boolean;
  471. begin
  472.     FileToList := FileToListS(strpas(thefile));
  473. end;
  474.  
  475. function tExecObject.FileToListS(thefile : String): boolean;
  476. var
  477.    Inf : Text;
  478.    temp : pNode;
  479.    buffer : PChar;
  480.    buf : Array [0..500] of Char;
  481. begin
  482.    buffer := @buf;
  483.    Assign(Inf, thefile);
  484.    {$I-}
  485.    Reset(Inf);
  486.    {$I+}
  487.    if IOResult = 0 then begin
  488.       while not eof(Inf) do begin
  489.       { I don't want end of lines here (for use with amiga listviews)
  490.         just change this if you need newline characters.
  491.       }
  492.          Read(Inf, buffer);
  493.          temp := Add(buffer);
  494.          Readln(inf, buffer);
  495.       end;
  496.       CLose(Inf);
  497.       FileToListS := true;
  498.    end else FileToListS := false;
  499. end;
  500.  
  501. function tExecObject.ListToFile(TheFile : PChar): Boolean;
  502. begin
  503.     ListToFile := ListToFileS(strpas(TheFile));
  504. end;
  505.  
  506. function tExecObject.ListToFileS(TheFile : String): Boolean;
  507. VAR
  508.     Out      : Text;
  509.     dummy    : Longint;
  510.     temp     : pNode;
  511. begin
  512.     Assign(Out, TheFile);
  513.     {$I-}
  514.     Rewrite(Out);
  515.     {$I+}
  516.     if IOResult = 0 then begin
  517.        IF number > 0 THEN BEGIN
  518.           temp := elist^.lh_Head;
  519.           FOR dummy := 1 TO number DO BEGIN
  520.              IF temp^.ln_Name <> NIL THEN BEGIN
  521.                 {
  522.                   Have to check the strlen here, if it's an
  523.                   empty pchar fpc will write out a #0
  524.                 }
  525.                 if strlen(temp^.ln_Name) > 0 then
  526.                    WriteLN(Out,temp^.ln_Name)
  527.                 else writeln(Out);
  528.              END;
  529.              temp := temp^.ln_Succ;
  530.           END;
  531.         END;
  532.         Close(Out);
  533.         ListToFileS := True;
  534.     END Else ListToFileS := False;
  535. END;
  536.  
  537.  
  538. end.
  539.  
  540.